package pl.edu.pw.elka.tinyrepo.gate.server;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;

import pl.edu.pw.elka.tinyrepo.common.HTTPHeaderType;
import pl.edu.pw.elka.tinyrepo.common.RequestHandler;
import pl.edu.pw.elka.tinyrepo.common.Response;
import pl.edu.pw.elka.tinyrepo.common.StatusCode;
import pl.edu.pw.elka.tinyrepo.common.exceptions.ContentAlreadyExistException;
import pl.edu.pw.elka.tinyrepo.common.exceptions.WrongPathException;
import pl.edu.pw.elka.tinyrepo.gate.descriptor.RepoDescriptor;


/**
 * @author: Kajot
 */

class COPYRequestHandler extends GateRequestHandler {
   
   public COPYRequestHandler(RepoDescriptor desc) {
      super(desc);
   }
   
   @Override
   public void run() {
	   
      OutputStream out = null;
      
      try { 

         out = incomming.getOutputStream(); 		// wyjscie do klienta
         String source = request.getPath(); 	// zadany w requescie plik/katalog
         String dest = request.getHeader(HTTPHeaderType.DESTINATION);
         if(dest == null) {
            throw new IllegalArgumentException("missed destination");
         }
         
         desc.copyFileOrDirectoryDesc(source, dest); // TODO tylko symboliczne dowiazanie
         // problemem jest to, ze RMI wymaga aby argumenty byly Serializable, a strumienie
         // takie nie sa, wiec ciezko zrobic cos takiego, zeby serwer pobieral strumieniowo
         // dane lub ew. nakazywal jednemu serwerowi skopiowanie danych z podanego strumienia
         
         Response res = new Response(StatusCode.CREATED);
         res.write(out);
         System.out.println("Sent response: \n"+res);
         
      }
      catch (IllegalArgumentException e) {
         e.printStackTrace();
         Response rs = new Response(StatusCode.BAD_REQUEST);
         rs.write(out);
      }
      catch (ContentAlreadyExistException e) { // w webdav jest w przypadku konfliktu jest overwriting, tutaj go pomijamy
         e.printStackTrace();
         Response rs = new Response(StatusCode.CONFLICT);
         rs.write(out);
      }
      catch (FileNotFoundException e) { // pliku nie ma
         e.printStackTrace();
         Response rs = new Response(StatusCode.NOT_FOUND);
         rs.write(out);
      }
      catch (WrongPathException e) { // nieprawidlowa sciezka do pliku
         e.printStackTrace();
         Response rs = new Response(StatusCode.NOT_FOUND);
         rs.write(out);
      }
      catch (IOException e) {
         // cos nie tak z polaczeniem, nic nie wysylaj, wyswietl info na serwerze
         e.printStackTrace();
      }
      // socket jest zamykany w klasach DAVServer
   }


   @Override
   public RequestHandler copy() {
      return new COPYRequestHandler(desc);
   }
   
   
}
